// script: CmdName (XXX a, YYY b)
//	eg: Add(34)
//  eg: Multi (23,12)

enum ERawType {
	RT_Bool, RT_Float, RT_Integer, RT_String
};

class Arg {
public:
	ERawType GetType() const;

private:
	union {
		bool _bool;
		float _float;
		long _integer;
		const char* _string;
	};

	ERawType	typeFlag;
	size_t		size;
};

struct Result 
{
	Arg value;
	bool valid;
};

struct CmdEntity 
{
	string name;
	Result result;

	list<Arg> input;
};

typedef Result InternalDo(const list<Arg>&);

void AddCmd(const char* cmd, InternalDo proc);

// engine -- server
void CmdSystem_Init() 
{
//  Generic
// 	AddCmd("Add", Callback_Add);
// 	AddCmd("Multi", Callback_Multi);

// 	edit
// 	AddCmd("Select", Callback_Select);
// 	AddCmd("Move", Callback_Add);
}

Result Callback_Select(const list<Arg>& args) {

// 	assert(args.Num() == 2);
// 	assert(args[0].GetType() == RT_Float);
// 	assert(args[1].GetType() == RT_Float);
// 
// 	// ...
// 	RayToSelectModelInScene(args[0].GetFloat(), args[1].GetFloat());
// 	
	
	Result ret;
	ret.valid = false;
	return ret;
}

// tool -- client
void Edit_xxx() {

// 	SendCmd("Select(34.0f,12.34f)");
// 	// ....
// 	SendCmd("Move(34.0f,12.34f)");
// 	SendCmd("Select(34.0f,12.34f)");
// 	SendCmd("Select(34.0f,12.34f)");
}


// engine -- server
void ProcessCmd() 
{
// 	Timer& timer = ...;
// 
// 	for(int i=0; i<cmdQueue.Num(); ++i) 
// 	{
// 		string& cmdLabel = cmdQueue[i];
// 		CmdEntity cmdEntity = Parser(cmdLable);
// 		InternalDo doProc = cmdMapTable[cmdEntity.name];
// 		cmdEntity.result = doProc(cmdEntity.input);
// 		// ....
// 	}
}


